package com.qiaofang.collectmanage.analysis;

import com.alibaba.fastjson.JSONObject;
import com.qiaofang.collectmanage.constants.CollectRuleFieldEnum;
import com.qiaofang.collectmanage.utils.DateUtils;
import com.qiaofang.collectmanage.utils.NetUtils;
import com.qiaofang.collectmanage.utils.RegExUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.regex.Pattern;

/**
 * Created with IDEA
 * 3、对元素的值后续操作
 * 此类方法值只允许，新增，不允许修改 ，修改需要review
 *
 * @author:ZJ.J
 * @Date:2018/6/1
 * @Time:14:28
 */
public class ReturnValue {
    private static Logger log = LoggerFactory.getLogger(ReturnValue.class);

    /**
     * 先切割，在通过角标获取对应元素
     *
     * @param eleValue
     * @param args     args[0] 方法名称
     *                 args[1] split参数
     *                 args[2] 获取对应下标元素
     * @return
     */
    public static String splitAndGet(String eleValue, JSONObject analysisEntity ,String... args) {
        String returnStr = "";
        if (args.length == 3) {
            String regex = args[1];
            if (eleValue.contains(regex)) {
                int index = Integer.valueOf(args[2]);
                String[] split = eleValue.split(regex);
                if (split.length > index) {
                    returnStr = split[index];
                }
            } else {
                return eleValue;
            }
        }
        return returnStr;
    }

    /**
     * 对各大网站时间做统一处理，返回统一格式时间
     *
     * @param eleValue 支持的格式化的时间有： null、""、今天、3分钟前、3小时前、3天前、一天前、05-29、2018-05-29、2018年05月29日
     *                 有新的时间字符继续完善此方法
     * @param args     args[0] 方法名称
     * @return yyyy-MM-dd'T'HH:mm:ss.SSS
     */
    public static String time(String eleValue,JSONObject analysisEntity , String... args) {
        return DateUtils.parsePublishTime(eleValue, DateUtils.YYYY_MM_DD_T_HH_MM_SS_SSSZ);
    }

    /**
     * 判断是否包含一个值
     *
     * @param eleValue
     * @param args     args[1]  包含的值
     *                 args[2];  包含返回的值
     *                 args[3];  不包含返回的值
     * @return
     */

    public static String contains(String eleValue, JSONObject analysisEntity ,String... args) {
        String returnStr;
        String containValue = args[1];
        String isTrue = args[2];
        String isFalse = args[3];
        if (eleValue.contains(containValue)) {
            returnStr = isTrue;
        } else {
            returnStr = isFalse;
        }
        return returnStr;
    }


    /**
     * 判断是否包含一个值
     * 如果包含则返回eleValue
     * 不包含则返回空字符串
     * @param eleValue
     * @param args     args[1]  包含的值
     *
     *
     * @return
     */

    public static String isContains(String eleValue, JSONObject analysisEntity ,String... args) {
        String returnStr="";
        String containValue = args[1];
        if (eleValue.contains(containValue)) {
           return eleValue;
        }
        return returnStr;
    }


    /**
     * 替换
     *
     * @param eleValue
     * @param args     args[1] oldstr
     *                 args[2]  newstr 默认为串
     * @return
     */
    public static String replace(String eleValue, JSONObject analysisEntity ,String... args) {
        String oldStr;
        String newStr = "";
        if (args.length == 3) {
            oldStr = args[1];
            newStr = args[2];
        } else {
            oldStr = args[1];
        }
        if (eleValue.contains(oldStr)) {
            return eleValue.replace(oldStr, newStr);
        } else {
            return eleValue;
        }
    }

    /**
     * 提取字串中的数字
     *
     * @param eleValue
     * @param args
     * @return
     */
    public static String getNum(String eleValue, JSONObject analysisEntity ,String... args) {
        return RegExUtils.getNum(eleValue);
    }

    /**
     * 先切割在填充
     *
     * @param eleValue
     * @param args     args[1] 分隔符
     *                 args[2]  -1 在前拼接，1在后拼接
     *                 args[3] 拼接字符
     * @return
     */
    public static String splitAndFill(String eleValue, JSONObject analysisEntity ,String... args) {
        StringBuilder str = new StringBuilder();
        Pattern splitStr = Pattern.compile(args[1]);
        Integer fillPosition = Integer.valueOf(args[2]);
        String fillStr = args[3];
        for (String s : splitStr.split(eleValue)) {
            if (fillPosition.equals(-1)) {
                str.append(fillStr).append(s).append(args[1]);
            } else if (fillPosition.equals(1)) {
                str.append(s).append(fillStr).append(args[1]);
            }
        }
        return str.toString();
    }

    /**
     * 填充
     *
     * @param eleValue
     * @param args     args[1]  -1 在前拼接，1在后拼接
     *                 args[2] 拼接字符
     * @return
     */
    public static String fill(String eleValue, JSONObject analysisEntity ,String... args) {
        StringBuilder str = new StringBuilder();
        Integer fillPosition = Integer.valueOf(args[1]);
        String fillStr = args[2];
        if (fillPosition.equals(-1)) {
            str.append(fillStr).append(eleValue);
        } else if (fillPosition.equals(1)) {
            str.append(eleValue).append(fillStr);
        }
        return str.toString();
    }

    /**
     *  通过key获取json字符串中的值
     * @param eleValue josn 字符串
     * @param args  args[1] key
     * @return
     */
    public static String getValueByJsonKey(String eleValue, JSONObject analysisEntity ,String... args){
       return (String) JSONObject.parseObject(eleValue).get(args[1]);
    }

    /**
     *
     * @param eleValue
     * @param args
     * @return
     */
    public static String ifElse(String eleValue,JSONObject analysisEntity , String... args){
        String returnValue;
        if(args[1].equals(eleValue)){
            returnValue = args[1];
        }else{
            returnValue = args[2];
        }
        return returnValue;
    }

    /**
     * 添加前缀域名
     *
     * @param eleValue 元素文本
     * @param jsonObject 采集规则参数如采集地址
     * @param args 参数
     * @return
     */
    public static String addSite(String eleValue, JSONObject jsonObject ,String... args) throws Exception{
        String webSite = (String)jsonObject.get(CollectRuleFieldEnum.WEBSITE.getValue());
        String http = webSite.split("//")[0];
        StringBuilder sb = new StringBuilder();
        String domain = NetUtils.getDomain(webSite);
        //1、不包含http 且 不包含domain
        if(!eleValue.contains("http")){
            if(!eleValue.contains(domain)){
                sb.append(http).append("//").append(domain);
            }
        }
        sb.append(eleValue);
        return sb.toString();
    }

    /**
     *
     * @param eleValue 房龄
     * @param args
     * @return
     */
    public static String getYear(String eleValue, String... args){
        if (!StringUtils.isNumeric(eleValue)) {
            return eleValue;
        }
        LocalDate now = LocalDate.now();
        LocalDate beforeDate = now.minus(Integer.valueOf(eleValue), ChronoUnit.YEARS);
        String returnValue = String.valueOf(beforeDate.getYear());
        return returnValue;
    }

    /**
     * 先切割，在通过角标获取对应元素
     *
     * @param eleValue
     * @param args     args[0] 方法名称
     *                 args[1] split参数
     *                 args[2] 获取对应下标元素
     * @return
     */
    public static String splitAndSet(String eleValue, JSONObject analysisEntity , String... args) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            String regex = args[1];
            if (eleValue.contains(regex)) {
                String[] split = eleValue.split(regex);
                for (String str : split) {
                    str = (args.length == 3) ? args[2] + str : str;
                    str = addSite(str, analysisEntity, args);
                    stringBuilder.append(str);
                    stringBuilder.append(regex);
                }
            }
        } catch (Exception e) {
            log.info("图片循环添加前缀{}", e);
        }
        return stringBuilder.toString();
    }

    /**
     * 先切割，在通过角标获取对应元素
     *
     * @param eleValue
     * @param args     args[0] 方法名称
     *                 args[1] split参数
     *                 args[2] 获取对应下标元素
     * @return
     */
    public static String mergeStr(String eleValue, JSONObject analysisEntity , String... args) {
        String returnValue;
        if (StringUtils.isBlank(eleValue)) {
            returnValue = analysisEntity.getString(args[1]);
        } else {
            returnValue = eleValue;
        }
        returnValue = StringUtils.isBlank(returnValue) ? "" : returnValue;
        return returnValue;
    }
}
